﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Helena.Areas.Productos.Models;
using Telerik.Web.Mvc;
using Helena.Areas.Categorias.Models;
using Helena.Areas.Campanas.Models;
using Helena.Areas.Configuraciones.Models;
using System.Threading;
using Helena.Areas.Vendedores.Models;
using Helena.Areas.Ventas.Models;
using Helena.Areas.Clientes.Models;
using Helena.Areas.Reportes.Models;
using Helena.Models;

namespace Helena.Areas.Ventas.Controllers
{
    public class CambVentaController : Controller
    {
        LogicaVenta db = new LogicaVenta();
        LogicaProducto pro_db = new LogicaProducto();
        LogicaConfiguraciones conf_db = new LogicaConfiguraciones();
        LogicaCliente cli_db = new LogicaCliente();
        LogicaTarjeta tar_db = new LogicaTarjeta();
        LogicaKardex kardex = new LogicaKardex();

        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Index()
        {
            VendedorView vw = (VendedorView)Session["Vendedor"];
            if (vw.ID != 0)
            {
                return View();
            }
            else
            {
                return Redirect("../Home/NoSession");
            }
        }

        #region Comprobante
        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult VentaTicket()
        {
            VentaView venta = (VentaView)Session["NuevaVenta"];
            venta.Ticket = db.RetornarNextTicket();
            Session["clientes"] = cli_db.i_RetornarClientes();
            Session["Tarjetas"] = tar_db.i_RetornarTarjetas();
            Session["Configuracion"] = conf_db.ObtenerUltimaConfiguracion();

            List<VendedorView> salida = new List<VendedorView>();

            salida.Add((VendedorView)Session["Vendedor"]);
            Session["vendedores"] = salida;
            return View(venta);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult VentaTicket(VentaView venta)
        {
            if ((venta.Pago_con_Tarjeta_en_Soles == 0) && (venta.Pago_en_Efectivo_en_Dolares == 0) && (venta.Pago_en_Efectivo_en_Soles  == 0))
            {
                VentaView sventa = (VentaView)Session["NuevaVenta"];
                sventa.Ticket = db.RetornarNextTicket();
                return View(sventa);
            }
            else
            {
                VentaView imprimir = ObtenerVenta(venta);
                
                List<DetalleVentaView> detallesalir =db.DetallesDeUnaVenta(imprimir.ID);
                
                foreach (DetalleVentaView d in detallesalir)
                {
                    db.i_EliminarDetalle(imprimir.ID, d);
                }
                
                IngresarDetallesDeVenta(imprimir, (List<DetalleVentaView>)Session["Detalle"]);

                Session["NuevaVenta"] = null;
                Session["Detalle"] = null;

                //Util.ImprimirVenta(imprimir);

                return RedirectToAction("Index", "CambDetalleVenta");
            }
        }

        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult VentaBoleta()
        {
            VentaView venta = (VentaView)Session["NuevaVenta"];
            venta.Boleta = db.RetornarNextBoleta();
            Session["clientes"] = cli_db.i_RetornarClientes();
            Session["Tarjetas"] = tar_db.i_RetornarTarjetas();
            Session["Configuracion"] = conf_db.ObtenerUltimaConfiguracion();

            List<VendedorView> salida = new List<VendedorView>();
            salida.Add((VendedorView)Session["Vendedor"]);

            Session["vendedores"] = salida;
            return View(venta);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult VentaBoleta(VentaView venta)
        {
            if ((venta.Pago_con_Tarjeta_en_Soles == 0) && (venta.Pago_en_Efectivo_en_Dolares == 0) && (venta.Pago_en_Efectivo_en_Soles == 0))
            {
                VentaView sventa = (VentaView)Session["NuevaVenta"];
                sventa.Ticket = db.RetornarNextTicket();
                return View(sventa);
            }
            else
            {
                VentaView imprimir = ObtenerVenta(venta);
                List<DetalleVentaView> detallesalir = db.DetallesDeUnaVenta(imprimir.ID);

                foreach (DetalleVentaView d in detallesalir)
                {
                    db.i_EliminarDetalle(imprimir.ID, d);
                }

                IngresarDetallesDeVenta(imprimir, (List<DetalleVentaView>)Session["Detalle"]);

                Session["NuevaVenta"] = null;
                Session["Detalle"] = null;
                return RedirectToAction("Index", "CambDetalleVenta");
            }
        }

        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult VentaFactura()
        {
            VentaView venta = (VentaView)Session["NuevaVenta"];
            venta.Factura = db.RetornarNextFactura();
            Session["clientes"] = cli_db.i_RetornarClientes();
            Session["Tarjetas"] = tar_db.i_RetornarTarjetas();
            Session["Configuracion"] = conf_db.ObtenerUltimaConfiguracion();

            List<VendedorView> salida = new List<VendedorView>();
            salida.Add((VendedorView)Session["Vendedor"]);
            return View(venta);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult VentaFactura(VentaView venta)
        {
            if ((venta.Pago_con_Tarjeta_en_Soles == 0) && (venta.Pago_en_Efectivo_en_Dolares == 0) && (venta.Pago_en_Efectivo_en_Soles == 0))
            {
                VentaView sventa = (VentaView)Session["NuevaVenta"];
                sventa.Ticket = db.RetornarNextTicket();
                return View(sventa);
            }
            else
            {
                VentaView imprimir = ObtenerVenta(venta);
                List<DetalleVentaView> detallesalir = db.DetallesDeUnaVenta(imprimir.ID);

                foreach (DetalleVentaView d in detallesalir)
                {
                    db.i_EliminarDetalle(imprimir.ID, d);
                }

                IngresarDetallesDeVenta(imprimir, (List<DetalleVentaView>)Session["Detalle"]);

                Session["NuevaVenta"] = null;
                Session["Detalle"] = null;

                //Util.ImprimirVenta(imprimir);
                //Util.ImprimirVenta(imprimir);

                return RedirectToAction("Index", "CambDetalleVenta");
            }
        }

       
        #endregion

        #region Almacenar

        public VentaView ObtenerVenta(VentaView venta)
        {

            VentaView Almacenada = (VentaView)Session["NuevaVenta"];
            Almacenada.ID = 0;
            //Permite cambiar el numerero de comprobante
            
            Almacenada.Boleta = venta.Boleta;
            Almacenada.Factura = venta.Factura;
            Almacenada.Ticket = venta.Ticket;
            Almacenada.Fecha = venta.Fecha;
            Almacenada.Descuento = venta.Descuento;
            Almacenada.Sub_Total = venta.Sub_Total;
            Almacenada.Total_En_Soles = venta.Total_En_Soles;
            Almacenada.Total_En_Dolares = venta.Total_En_Soles/Convert.ToDecimal(conf_db.ObtenerUltimaConfiguracion().TipoCambio);
            Almacenada.Pago_en_Efectivo_en_Soles = venta.Pago_en_Efectivo_en_Soles;
            Almacenada.Pago_en_Efectivo_en_Dolares = venta.Pago_en_Efectivo_en_Dolares;
            Almacenada.Pago_con_Tarjeta_en_Soles = venta.Pago_con_Tarjeta_en_Soles;
            
            if (venta.tarjetaID != 0)
            {
                Almacenada.tarjetaID = venta.tarjetaID;
            }            
            Almacenada.Vuelto = venta.Vuelto;


            Venta saleventa;

            if( Almacenada.Ticket!=0 )
            {
                saleventa =db.context_publico.t_Venta.Where(t => t.Ticket ==Almacenada.Ticket).FirstOrDefault();
            }else
            {
                if (Almacenada.Boleta!=0)
                {
                    saleventa = db.context_publico.t_Venta.Where(t => t.Boleta == Almacenada.Boleta).FirstOrDefault();
                }else
                {
                    saleventa = db.context_publico.t_Venta.Where(t => t.Factura == Almacenada.Factura).FirstOrDefault();
                }
            }

            VentaView AXU = new VentaView();
            AXU.ID=saleventa.ID;
            //Permite cambiar el numerero de comprobante
            AXU.Boleta = Almacenada.Boleta;
            AXU.Factura = venta.Factura;
            AXU.Ticket = Almacenada.Ticket;
            AXU.Fecha = Almacenada.Fecha;
            AXU.Descuento = Almacenada.Descuento;
            AXU.Sub_Total = Almacenada.Sub_Total;
            AXU.Total_En_Soles = Almacenada.Total_En_Soles;
            AXU.Total_En_Dolares = Almacenada.Total_En_Dolares;
            AXU.Pago_en_Efectivo_en_Soles = Almacenada.Pago_en_Efectivo_en_Soles;
            AXU.Pago_en_Efectivo_en_Dolares = Almacenada.Pago_en_Efectivo_en_Dolares;
            AXU.Pago_con_Tarjeta_en_Soles = Almacenada.Pago_con_Tarjeta_en_Soles;
            AXU.ClienteID = Almacenada.ClienteID;
            AXU.VendedorID = Almacenada.VendedorID;
            db.i_ModificarVenta(AXU);
            return AXU;
        }

        public void IngresarDetallesDeVenta(VentaView v, List<DetalleVentaView> detalles)
        {
            foreach (DetalleVentaView d in detalles)
            {
                // por cada detalle de venta se realiza la actualizacion de
                    //Venta
                    //Producto
                    //Kardex
                //Ingresa la venta del producto simple o compuesto
                ProductoView p = pro_db.i_RetornarProducto(d.ProductoID);
                
                d.VentaID = v.ID; // el detalle se linkea a una venta
                d.ID=0;
                // aca no hay movimiento de stock
                // se ingresa el kardex x el stock inicial
                kardex.IngresarVenta(p, d.Cantidad, DateTime.Now);

                //Se actualiza los productos
                db.AgregarDetalleaVenta(v.ID, d);
            }
        }
        #endregion

    }
}